//____________________________________________________________________________//
//
// BDB


BOOST_AUTO_TEST_CASE( bdb_cache )
{
	using boost::format;
	using namespace HappyDB::Common;
	HappyDB::Common::CHappyEngineOption opt;
	HappyDB::Common::ITEM * it;
	HappyDB::Common::CMemPool<HappyDB::Common::ITEM> mem(size_t(100));
	HappyDB::CacheEngine::CBDBCache bdb(&opt);


	char * key1 = "1111111111111111111111111111111";
	char * key2 = "2222222222222222222222222222222";
	char * key3 = "3333333333333333333333333333333";
	char * key4 = "4444444444444444444444444444444";
	char * key5 = "5555555555555555555555555555555";
	char * key6 = "6666666666666666666666666666666";
	
	void * p = mem.malloc();
	memset(p, 0, 100);
	it = (HappyDB::Common::ITEM*)p;
	u_int32_t nkey = (u_int32_t)strlen(key1);


	bdb.BDBSettingsInit(false);
	bdb.BDBEnvInit();
	bdb.BDBOpen();


	// Read a unknown key
	BOOST_CHECK(bdb.ItemGet(key6, nkey, it, 2048) == -2);

	
	// write a data
	ITEM_set(it, nkey, 0, nkey);
	memcpy(ITEM_key(it), key1, nkey);
	memcpy(ITEM_data(it), key2, nkey);

	// write other 
	BOOST_CHECK(bdb.ItemPut(key1, 0, it) == -1);					// key length = 0
	BOOST_CHECK(bdb.ItemPut(key1, nkey, NULL) == -1);				// it = NULL

	std::cout << "key = " << key1 << " data = " << ITEM_data(it) << std::endl;
	BOOST_CHECK(bdb.ItemPut(key1, nkey, it) == 0);					// normal


	// read key1
	memset(p, 0, 100);
	ITEM_set(it, nkey, 0, nkey);
	BOOST_CHECK(bdb.ItemGet(key1, nkey, it, 100) == 0);			// normal 
	std::cout << "key = " << key1 << " data = " << ITEM_data(it) << std::endl;


	// read other 
	BOOST_CHECK(bdb.ItemGet(key1, 0, it, 10) == -1);				// key length = 0
	BOOST_CHECK(bdb.ItemGet(key1, nkey, NULL, 100) == -1);			// it = NULL
	int size_it = ITEM_ntotal(it);
	BOOST_CHECK(bdb.ItemGet(key1, nkey, it, 10) == size_it);		// ulen < data size
	BOOST_CHECK(bdb.ItemGet(key6, nkey, it, 100) == -2);			// not exists


	// exists
	BOOST_CHECK(bdb.ItemExists(key1, nkey) == 1);					// exists
	BOOST_CHECK(bdb.ItemExists(key6, nkey) == 0);					// not exists

	// delete key1
	BOOST_CHECK(bdb.ItemDel(key1, 0) == -1);						// key length = 0
	BOOST_CHECK(bdb.ItemDel(key1, nkey) == 0);						// normal
	BOOST_CHECK(bdb.ItemDel(key2, nkey) == -2);						// not exists


	bdb.BDBClose();
	bdb.BDBEnvClose();
}

//____________________________________________________________________________//
